// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>
// using namespace std;

// void *func(void * arg)
// {
//     char *str;
//     str = (char*)arg;

//     while(1)
//     {
//         sleep(1);
//         cout << "I am thread ";
//         cout << str << endl;
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,func,(void*)"thread-1");
//     while(1)
//     {
//         sleep(1);
//         cout << "I am process " << endl;
//     }
// }

// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>
// using namespace std;

// int g_val = 100;

// void *func(void * arg)
// {
//     char *str;
//     str = (char*)arg;

//     while(1)
//     {
//         cout << "I am thread ";
//         cout << str << ", my val = " << g_val << " " << &g_val << endl;
//         g_val++;
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,func,(void*)"thread-1");
//     while(1)
//     {
//         sleep(1);
//         cout << "I am process ";
//         cout << "main val = " << g_val <<  ' ' << &g_val << endl;
//     }
// }

// #include <iostream>
// #include <pthread.h>
// using namespace std;
// void* sumCount(void *arg)
// {
//     int* result = new int(100);  // 动态分配内存存储结果
//     return (void*)result;       // 返回指向该内存的指针
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,sumCount,(void*)"tmp");
//     void *ret;
//     pthread_join(tid,&ret);
//     cout << *(int*)ret << endl;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include <unistd.h>
// #include <pthread.h>
// void *thread_run(void *arg)
// {
//     pthread_detach(pthread_self());
//     printf("%s\n", (char *)arg);
//     return NULL;
// }
// int main(void)
// {
//     pthread_t tid;
//     if (pthread_create(&tid, NULL, thread_run, (void*)"thread1 run...") != 0)
//     {
//         printf("create thread error\n");
//         return 1;
//     }
//     int ret = 0;
//     sleep(1); // 很重要，要让线程先分离，再等待
//     if (pthread_join(tid, NULL) == 0)
//     {
//         printf("pthread wait success\n");
//         ret = 0;
//     }
//     else
//     {
//         printf("pthread wait failed\n");
//         ret = 1;
//     }
//     return ret;
// }

// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>

// void* thread1(void *arg)
// {
//     printf("thread 1 returning ... \n");
//     int *p = (int*)malloc(sizeof(int));
//     *p = 100;
//     return (void*)p;
// }
// void* thread2(void *arg)
// {
//     printf("thread 2 returning ... \n");
//     int *p = (int*)malloc(sizeof(int));
//     *p = 100;
//     pthread_exit((void*)p);
// }
// void* thread3(void* arg)
// {
//     while(1)
//     {
//         printf("thread 3 is running ...\n");
//         sleep(1);
//     }
//     return nullptr;
// }


// int main()
// {
//     pthread_t tid;
//     void *ret;

//     // return
//     pthread_create(&tid, nullptr, thread1, nullptr);
//     pthread_join(tid, &ret);
//     printf("thread return, thread id %X, return code:%d\n", tid, *(int*)ret);
//     free(ret);
//     // pthread_exit
//     pthread_create(&tid, nullptr, thread2, nullptr);
//     pthread_join(tid, &ret);
//     printf("thread return, thread id %X, return code:%d\n", tid, *(int*)ret);
//     free(ret);
//     // pthread_cancel
//     pthread_create(&tid, nullptr, thread3, nullptr);
//     sleep(5);
//     pthread_cancel(tid);
//     pthread_join(tid, &ret);
//     if(ret == PTHREAD_CANCELED)
//     {
//         printf("thread return, thread id %X ,return code:PTHREAD_CANCELED\n",tid);
//     }
//     else 
//     {
//         printf("thread return, thread id %X ,return code:nullptr\n",tid);
//     }
//     // free(ret);
//     // 此处不要调用 free(ret)！ret 是 PTHREAD_CANCELED，不是动态内存
// }



#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;
void threadrun()
{
    while(1)
    {
        cout << "I am a new thread for C++" << endl;
        sleep(1);
    }
}
int main()
{
    thread t1(threadrun);
    t1.join();
    return 0;
}